//C14.7:Worker.h -- working classes
#ifndef WORKER0_H__
#define WORKER0_H__

#include <string>

class Worker    // an abstract base class
{
    std::string fullname;
    long id;
    public:
        Worker(): fullname("no one"), id(0L) {}
        Worker(const std::string & s, long n)
                : fullname(s), id(n) {}
        virtual ~Worker() = 0;    // pure virtual destructor
        virtual void Set();
        virtual void Show() const;        
};

class Waiter : public Worker
{
    int panache;
    public:
        Waiter(): Worker(), panache(0) {}
        Waiter(const std::string & s, long n, int p = 0)
              : Worker(s, n), panache(p){}
        Waiter(const Worker & wk, int p = 0)
              : Worker(wk), panache(p){}      
        void Set();
        void Show() const;      
};

class Singer : public Worker
{
    protected:
        enum {other, alto, contralto, soprano,
                bass, baritone, tenor};
        enum {Vtypes = 7};        
    private:
        static char *pv[Vtypes];    // string equivs of voice types
        int voice;
    public:
        Singer() : Worker(), voice(other){}   
        Singer(const std::string & s, long n, int v = other)
                : Worker(s, n), voice(v){} 
        void Set();
        void Show() const;        
};
#endif